#ifndef __SERVER_H__
#define __SERVER_H__

// 导入项目头文件
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <stdlib.h>
#include <pthread.h>
#include <sys/stat.h>
#include <dirent.h>
#include <sys/wait.h>
#include <sys/epoll.h>

#include "user.h"
#define GREEN "\x1b[32m" // 绿色
#define RED "\x1b[31m"   // 红色
#define YELLOW "\x1b[33m" // 黄色
#define RESET "\x1b[0m"  // 重置颜色

//UDP 服务

#define FILE_DIR "my_file"

typedef struct UDP_data
{
    char time[15];   //格式 ：06/31 12:31:31
    int SYN;        // 请求类型  1 请求下载文件   2 请求上传文件
    int size_num;     // 文件数量 / 序号      | 请求连接 -> 文件数量 | 发送数据 -> 字符数量
    char name[31];  //用户名字
    char data[256]; //文件名 数据
}UDP_data ;


#define MAX_CLIENTS 100 // 最大客户端数
typedef struct ThreadSend
{
    int UDP_fd;
    struct sockaddr_in clientaddr;
    socklen_t addrlen;
    UDP_data data;
}Thread_Send;
extern int client_count ; 
extern int   client_count;
extern struct sockaddr_in  client_addrs[MAX_CLIENTS];
//UDP模块
extern pthread_mutex_t lock;
extern friend_list *peoplelist;
void UDP_Process(void);
//初始化UDP返回UDP套接字UDP_fd
int UDP_init(int port_num, char  *IP_addr);
//关闭UDP套接字
void UDP_close(int UDP_fd);
/*                          将文件目录打包到发送包                               */
UDP_data send_file_dir(char * file_dir_name ,UDP_data file_dir_pack);
/*              响应请求1  向客户端发送所在群的所有文件名称                        */
void* UDP_reply_1(void * val );
/*              响应请求2  接收客户端发送的文件名称                          */
void* UDP_reply_2(void * val );
void* UDP_reply_3(void * val );
void *UDP_reply_4(void *val);
void *UDP_reply_5(void *val);
void *UDP_reply_6(void *val);

void f_Scanf(void);
void f_Sign_Print(user_t  user_data) ;
void friend_f_add_Print( FriendList user_data) ;

void remove_client(struct sockaddr_in *client_addr);
void send_welcome_message(int server_fd, UDP_data *client_data);
void send_exit_message(int server_fd, UDP_data *client_data);


// TCP服务


#define MAX_EVENTS 10
#define PORT 8080
#define ONLINE 100
//TCP模块
void TCP_Process(void);

// 用于单聊
typedef struct TCP_data
{
    int SYN;
    char star_name[16]; // 发送者 姓名
    char dest_name[16]; // 接收者 姓名
    char data[1024];     // 需要发送的数据  限制每次发送的数据长度不能超过1024字节
}TCP_data;



//用于信息转发
typedef struct TCP_info
{
    //与服务器建立连接的fd
    int star_fd;   
    int dest_fd; 
    char star_name[16]; // 发送者 姓名
    char dest_name[16]; // 接收者 姓名
} TCP_info;




#endif

